package com.baizhi.shiro.realm;

import com.baizhi.dao.AdminDao;
import com.baizhi.entity.Admin;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.realm.AuthenticatingRealm;
import org.apache.shiro.subject.Subject;

import javax.annotation.Resource;

/**
 * @author cyf碎碎恋
 *
 * 在shiro 权限管理中，由于shiro 默认是不查询数据库的
 * 我们得自己继承AuthenticationRealm抽象类，在实现的
 * 方法中自己查询数据库，然后将查询结果封装到
 * SimpleAuthenticationInfo  中
 *
 */

public class AuthenRealm extends AuthenticatingRealm {

   @Resource
   private AdminDao adminDao;

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken)
            throws AuthenticationException {

        UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
        String username = token.getUsername();
        Admin ad = new Admin();
        ad.setAdminName(username);
        Subject subject = SecurityUtils.getSubject();
        Admin admin = adminDao.selectAdminByField(ad);
        /**
         * @param 参数一,参数二 分别是查询数据库得到的对象的账号、密码
         *        参数三 是当前对象名,我们需要shiro 用我们写的类去进行
         *        验证，多态
         */
        if (admin != null) {
            System.out.println("in AuthenRealm============");
            subject.getSession().setAttribute("login",admin);
            return new SimpleAuthenticationInfo(admin.getAdminName(), admin.getPwd(), this.getName());
        }
        return null;
    }
}
